package com.zenithmind.classroom.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.classroom.pojo.dto.LessonCreateDTO;
import com.zenithmind.classroom.pojo.dto.LessonUpdateDTO;
import com.zenithmind.classroom.pojo.dto.LessonQueryDTO;
import com.zenithmind.classroom.pojo.domain.CourseLesson;
import com.zenithmind.classroom.pojo.vo.LessonDetailVO;
import com.zenithmind.classroom.pojo.vo.LessonVO;

import java.util.List;

/**
 * 课程课时服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface CourseLessonService extends IService<CourseLesson> {

    /**
     * 创建课时
     * 
     * @param createDTO 创建DTO
     * @return 课时VO
     */
    LessonVO createLesson(LessonCreateDTO createDTO);

    /**
     * 更新课时
     * 
     * @param id 课时ID
     * @param updateDTO 更新DTO
     * @return 是否成功
     */
    Boolean updateLesson(String id, LessonUpdateDTO updateDTO);

    /**
     * 删除课时
     * 
     * @param id 课时ID
     * @return 是否成功
     */
    Boolean deleteLesson(String id);

    /**
     * 发布课时
     * 
     * @param id 课时ID
     * @return 是否成功
     */
    Boolean publishLesson(String id);

    /**
     * 获取章节课时列表
     * 
     * @param chapterId 章节ID
     * @param includeUnpublished 是否包含未发布
     * @return 课时列表
     */
    List<LessonVO> getChapterLessons(String chapterId, Boolean includeUnpublished);

    /**
     * 获取课程课时列表
     * 
     * @param courseId 课程ID
     * @param includeUnpublished 是否包含未发布
     * @return 课时列表
     */
    List<LessonVO> getCourseLessons(String courseId, Boolean includeUnpublished);

    /**
     * 获取课时详情
     * 
     * @param id 课时ID
     * @param userId 用户ID
     * @return 课时详情
     */
    LessonDetailVO getLessonDetail(String id, String userId);

    /**
     * 调整课时顺序
     * 
     * @param chapterId 章节ID
     * @param lessonIds 课时ID列表（按新顺序）
     * @return 是否成功
     */
    Boolean reorderLessons(String chapterId, List<String> lessonIds);

    /**
     * 移动课时到其他章节
     *
     * @param lessonId 课时ID
     * @param targetChapterId 目标章节ID
     * @param sortOrder 排序值
     * @return 是否成功
     */
    Boolean moveLesson(String lessonId, String targetChapterId, Integer sortOrder);

    /**
     * 复制课时
     * 
     * @param lessonId 源课时ID
     * @param targetChapterId 目标章节ID
     * @param title 新课时标题
     * @return 新课时VO
     */
    LessonVO copyLesson(String lessonId, String targetChapterId, String title);

    /**
     * 批量创建课时
     * 
     * @param lessons 课时列表
     * @return 创建成功数量
     */
    Integer batchCreateLessons(List<LessonCreateDTO> lessons);

    /**
     * 上传课时资源
     * 
     * @param lessonId 课时ID
     * @param resourceType 资源类型
     * @param resourceUrl 资源URL
     * @param resourceSize 资源大小
     * @return 是否成功
     */
    Boolean uploadLessonResource(String lessonId, String resourceType, String resourceUrl, Long resourceSize);

    /**
     * 获取课时播放地址
     * 
     * @param lessonId 课时ID
     * @param userId 用户ID
     * @return 播放地址
     */
    String getLessonPlayUrl(String lessonId, String userId);

    /**
     * 记录课时观看
     * 
     * @param lessonId 课时ID
     * @param userId 用户ID
     * @param watchTime 观看时长
     * @param position 观看位置
     * @return 是否成功
     */
    Boolean recordLessonWatch(String lessonId, String userId, Integer watchTime, Integer position);

    /**
     * 标记课时完成
     * 
     * @param lessonId 课时ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean completeLessonStudy(String lessonId, String userId);

    /**
     * 获取课时学习进度
     * 
     * @param lessonId 课时ID
     * @param userId 用户ID
     * @return 进度百分比
     */
    Integer getLessonProgress(String lessonId, String userId);

    /**
     * 更新课时统计
     * 
     * @param lessonId 课时ID
     * @return 是否成功
     */
    Boolean updateLessonStatistics(String lessonId);

    /**
     * 获取下一课时
     *
     * @param currentLessonId 当前课时ID
     * @param userId 用户ID
     * @return 下一课时
     */
    LessonVO getNextLesson(String currentLessonId, String userId);

    /**
     * 下架课时
     *
     * @param id 课时ID
     * @return 是否成功
     */
    Boolean unpublishLesson(String id);

    /**
     * 获取章节课时列表（带用户进度）
     *
     * @param chapterId 章节ID
     * @param userId 用户ID
     * @param includeUnpublished 是否包含未发布
     * @return 课时列表
     */
    List<LessonVO> getChapterLessons(String chapterId, String userId, Boolean includeUnpublished);

    /**
     * 获取课程课时列表（带用户进度）
     *
     * @param courseId 课程ID
     * @param userId 用户ID
     * @param includeUnpublished 是否包含未发布
     * @return 课时列表
     */
    List<LessonVO> getCourseLessons(String courseId, String userId, Boolean includeUnpublished);

    /**
     * 获取课时统计
     *
     * @param id 课时ID
     * @return 统计信息
     */
    Object getLessonStatistics(String id);

    /**
     * 批量导入课时
     *
     * @param lessons 课时列表
     * @return 导入成功数量
     */
    Integer batchImportLessons(List<LessonCreateDTO> lessons);

    /**
     * 导出课时
     *
     * @param lessonIds 课时ID列表
     * @return 课时列表
     */
    List<LessonVO> exportLessons(List<String> lessonIds);

    /**
     * 获取上一课时
     * 
     * @param currentLessonId 当前课时ID
     * @param userId 用户ID
     * @return 上一课时
     */
    LessonVO getPreviousLesson(String currentLessonId, String userId);

    /**
     * 分页查询课时
     *
     * @param queryDTO 查询参数
     * @return 分页结果
     */
    PageResult<LessonVO> getLessonPage(LessonQueryDTO queryDTO);
}
